时间段指的是一段日期或时间。与时间段有关的问题,比如计算两个时间点之间相隔的天数或时间,或者给定一个起始日期和间隔天数求终止日期。[大谦Excel,dqexcel点com]
计算两个日期之间的间隔天数
【问题描述】
给定2个日期,计算二者之间的间隔天数。
【示例6-3】
本例使用的Excel文件的完整路径为“D:/Samples/ch06/时间段/计算两个日期之间的间隔天数/身份证号.xlsx”。该文件打开后如图6-3所示,请根据身份证号计算所有人员的年龄。
图6-3 身份证信息
- 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据
file_path = r'D:/Samples/ch06/时间段/计算两个日期之间的间隔天数/身份证号.xlsx'
df = pd.read_excel(file_path, engine='openpyxl', usecols='A:C', nrows=8)
# 计算所有人员的年龄并将其添加到“年龄”列
df['出生日期'] = df['身份证'].str[6:14] # 获取出生日期,即身份证号中第7-14个字符
current_date = pd.to_datetime('today') # 获取当前日期
df['年龄'] = ((current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')) / pd.Timedelta(days=365)).astype(int) # 计算得到年龄,并转换为整型
# 输出修改后的表数据
print(df)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加出生日期和年龄列后的数据。
code.python
>>> == RESTART: D:/Samples/1.py =
序号 姓名 身份证 出生日期 年龄
0 1 A 522324197403081*** 19740308 49
1 2 B 522324198302051*** 19830205 40
2 3 C 522324200701225*** 20070122 16
3 4 D 522324201001181*** 20100118 13
4 5 E 522324201803011*** 20180301 5
5 6 F 522324197109211*** 19710921 51
6 7 G 522324196706011*** 19670601 56
7 8 H 522324199210161*** 19921016 30
【知识点扩展】
本例中通过对身份证号字符串进行切片得到出生日期,然后用pandas的to_datatime(‘today’)得到当前日期,当前日期减去出生日期,得到年龄,取整数。
注意,本例代码中,两个日期相减得到的是它们之间间隔的天数,即
code.python
>>> current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')
0 17983 days 10:06:03.156163
1 14727 days 10:06:03.156163
2 5975 days 10:06:03.156163
3 4883 days 10:06:03.156163
4 1919 days 10:06:03.156163
5 18882 days 10:06:03.156163
6 20455 days 10:06:03.156163
7 11186 days 10:06:03.156163
Name: 出生日期, dtype: timedelta64[ns]
所以计算年龄,还需要将间隔天数除以一年365天,即
code.python
(current_date - pd.to_datetime(df['出生日期'], format='%Y%m%d')) / pd.Timedelta(days=365)
然后取整数。
上面数据类型timedelta64表示时间段。
已知起始日期和间隔天数计算终止日期
【问题描述】
给定起始日期和间隔天数,要求计算终止日期。
【示例6-4】
本例使用的Excel文件的完整路径为“D:/Samples/ch06/时间段/已知起始日期和间隔天数计算终止日期/图书借阅.xlsx”。该文件打开后如图6-4所示,请根据计算每本书的还书日期并添加到”还书日期“列。
图6-4 图书借阅
- 编写下面的代码:
code.python
import pandas as pd
# 读取Excel文件的第一个工作表中A-C列数据,引擎为"openpyxl"
df = pd.read_excel("D:/Samples/ch06/时间段/已知起始日期和间隔天数计算终止日期/图书借阅.xlsx", usecols="A:C", engine="openpyxl")
# 计算还书日期并添加到”还书日期“列
df["还书日期"] = df["借书日期"].apply(lambda x: x.replace(day=x.day, month=x.month+2))
# 去掉时间,只保留日期
df["还书日期"] = pd.to_datetime(df["还书日期"]).dt.date
# 输出修改后的表数据
print(df)
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存。运行脚本,在IDLE Shell窗口输出添加还书日期后的数据。
code.python
>>> == RESTART: D:/Samples/1.py =
姓名 图书 借书日期 还书日期
0 张满江 《红楼梦》 2023-04-12 2023-06-12
1 李俊 《唐诗三百首》 2023-04-18 2023-06-18
2 吴尚功 《普希金诗选》 2023-05-02 2023-07-02
3 龚步珍 《C++程序设计》 2023-05-17 2023-07-17
4 房一笑 《飘》 2023-05-25 2023-07-25
【知识点扩展】
本例用Series对象的replace方法计算还书日期,该方法用一个匿名函数给日期时间数据中的月份值加2,得到还书日期。